import java.math.*;
/**
 * 
 * @author pawel
 *Klasa opisuje przedzial w ktorym szukamy ekstremum
 *Klasa koduje wartosci z przedzialu na 31 bitach
 */
public class przedzial {
private double from;
private double to;
public final static int bits = 31;
public final static int MAX_VEC = (int)Math.pow(2, przedzial.bits  ) -1;
private double seed;
/**
 * 
 * @param from poczatek przedzialu
 * @param to koniec przedzialu
 */
public przedzial(double from,double to){
	this.from = from;
	this.to = to;
	this.seed = (Math.abs(this.to - this.from)/(Math.pow(2.0, (double)bits) - 1));
}
public double getFrom(){return this.from;}
public double getTo(){return this.to;}
/**
 * Konwerteruje zmiennoprzecinkowa wartosc z przedzialu na kod bitowy
 * @param value wartosc
 * @return kod bitowy
 */
public int toBitVec(double value){
	double val  ;
	if(value<this.from){
		val = this.from;
	}
	else if(value>this.to){
		val = this.to;
	}
	else{
		val = value;
	}
	
	return this.binToGray((int)(val/this.seed));
}
/**
 * Konwerteruje kod bitowy na liczbe zmiennoprzecinkowa
 * @param vec kod bitowy
 * @return liczba zmiennoprzecinkowa
 */
public double bitVecToFloat(int vec){
	return this.grayToBin((vec & Integer.MAX_VALUE)) * this.seed;
}
public int binToGray(int vec){
	int tmp = vec;
	tmp^=(tmp>>1);
	return tmp;
}
public int grayToBin(int vec){
	int tmp;
	tmp = vec ^(vec>>16);
	tmp^=(tmp>>8);
	tmp^=(tmp>>4);
	tmp^=(tmp>>2);
	tmp^=(tmp>>1);
	return tmp;
}
}
